/*********************************************************************************************************************
 * COPYRIGHT NOTICE
 * Copyright (c) 2018,逐飞科技
 * All rights reserved.
 * 技术讨论QQ群：	一群：179029047(已满)
 *					二群：244861897(已满)
 *					三群：824575535
 *
 * 以下所有内容版权均属逐飞科技所有，未经允许不得用于商业用途，
 * 欢迎各位使用并传播本程序，修改内容时必须保留逐飞科技的版权声明。
 *
 * @file			zf_sct.h
 * @company			成都逐飞科技有限公司
 * @author			逐飞科技(QQ3184284598)
 * @version			查看doc内version文件 版本说明
 * @Software		IAR 8.3 or MDK 5.24
 * @Taobao			https://seekfree.taobao.com/
 * @date			2020-03-25
 * @note			本文件作为 LPC55S 系列芯片开源库外设文件
					提供 SCT 外设驱动
					请注意 SCT0 总共可以配置16个匹配或者捕获值
					触发匹配或者捕获时 产生对应的事件
					PWM 模式下 OUT 寄存器根据设置匹配对应事件来改变输出
					那么意味着 32bit模式下 最大设置 10 个不同周期不同占空比的 PWM
					调用SDK库则只能生成 8 个不同周期不同占空比的 PWM 库函数每个 PWM 占用两个匹配
					可以详细参考手册来学习这个部分
 ********************************************************************************************************************/

#ifndef _ZF_SCT_H_
#define _ZF_SCT_H_

#ifdef RT_THREAD												// 如果启用了 RT-Thread OS
#include <rthw.h>
#include <rtthread.h>
#endif

#include "core_board_config.h"
#include "fsl_common.h"
#include "fsl_sctimer.h"

typedef enum
{
	SCT_PARAM_COUNT_MODE,
	SCT_PARAM_CLK_MODE,
	SCT_PARAM_CLK_SEL,
	SCT_PARAM_LCOUNT_DIR,
	SCT_PARAM_HCOUNT_DIR,
	SCT_PARAM_PRE_L,
	SCT_PARAM_PRE_H,
	SCT_PARAM_OUT_INIT,
	SCT_PARAM_IN_SYNC,
}sct_param_list;

typedef enum
{
	SCT_COUNT_MODE_16BIT,
	SCT_COUNT_MODE_32BIT,
}sct_count_mode_list;

typedef enum
{
	SCT_CLK_MODE_SYSTEM,				// 系统时钟使用
	SCT_CLK_MODE_SAMPLE,				// 系统时钟使用 输入采样
	SCT_CLK_MODE_INPUT,					// 输入时钟使用
	SCT_CLK_MODE_ASYNC,					// 使用输入时钟计数
}sct_clk_mode_list;

typedef enum
{
	SCT_CLK_SEL_IN0_RISING,
	SCT_CLK_SEL_IN0_FALLING,
	SCT_CLK_SEL_IN1_RISING,
	SCT_CLK_SEL_IN1_FALLING,
	SCT_CLK_SEL_IN2_RISING,
	SCT_CLK_SEL_IN2_FALLING,
	SCT_CLK_SEL_IN3_RISING,
	SCT_CLK_SEL_IN3_FALLING,
	SCT_CLK_SEL_IN4_RISING,
	SCT_CLK_SEL_IN4_FALLING,
	SCT_CLK_SEL_IN5_RISING,
	SCT_CLK_SEL_IN5_FALLING,
	SCT_CLK_SEL_IN6_RISING,
	SCT_CLK_SEL_IN6_FALLING,
	SCT_CLK_SEL_IN7_RISING,
	SCT_CLK_SEL_IN7_FALLING,
}sct_clk_sel_list;

typedef enum
{
	SCT_LCOUNT_DIR_UP,
	SCT_LCOUNT_DIR_UPDOWN,
}sct_lcount_dir_list;

typedef enum
{
	SCT_HCOUNT_DIR_UP,
	SCT_HCOUNT_DIR_UPDOWN,
}sct_hcount_dir_list;

typedef enum
{
	SCT_OUT_INIT_OUT0_LOW	= 0x0000,
	SCT_OUT_INIT_OUT0_HIGH	= 0x0001,
	SCT_OUT_INIT_OUT1_LOW	= 0x0000,
	SCT_OUT_INIT_OUT1_HIGH	= 0x0002,
	SCT_OUT_INIT_OUT2_LOW	= 0x0000,
	SCT_OUT_INIT_OUT2_HIGH	= 0x0004,
	SCT_OUT_INIT_OUT3_LOW	= 0x0000,
	SCT_OUT_INIT_OUT3_HIGH	= 0x0008,
	SCT_OUT_INIT_OUT4_LOW	= 0x0000,
	SCT_OUT_INIT_OUT4_HIGH	= 0x0010,
	SCT_OUT_INIT_OUT5_LOW	= 0x0000,
	SCT_OUT_INIT_OUT5_HIGH	= 0x0020,
	SCT_OUT_INIT_OUT6_LOW	= 0x0000,
	SCT_OUT_INIT_OUT6_HIGH	= 0x0040,
	SCT_OUT_INIT_OUT7_LOW	= 0x0000,
	SCT_OUT_INIT_OUT7_HIGH	= 0x0080,
	SCT_OUT_INIT_OUT8_LOW	= 0x0000,
	SCT_OUT_INIT_OUT8_HIGH	= 0x0100,
	SCT_OUT_INIT_OUT9_LOW	= 0x0000,
	SCT_OUT_INIT_OUT9_HIGH	= 0x0200,
}sct_out_init_list;

typedef enum
{
	SCT_IN_SYNC_IN0			= 0X1,
	SCT_IN_SYNC_IN1			= 0X2,
	SCT_IN_SYNC_IN2			= 0X4,
	SCT_IN_SYNC_IN3			= 0X8,
}sct_in_sync_list;

typedef enum
{
	SCT_PWM_OUT_0			= 0X00,
	SCT_PWM_OUT_1,
	SCT_PWM_OUT_2,
	SCT_PWM_OUT_3,
	SCT_PWM_OUT_4,
	SCT_PWM_OUT_5,
	SCT_PWM_OUT_6,
	SCT_PWM_OUT_7,
	SCT_PWM_OUT_8,
	SCT_PWM_OUT_9,
}sct_pwm_channel_list;

typedef enum
{
	SCT_PWM_LEVEL_LOW		= 0X0,
	SCT_PWM_LEVEL_HIGH		= 0X1,
}sct_pwm_level_list;

typedef enum
{
	SCT_PWM_MODE_EDGE		= 0X0,
	SCT_PWM_MODE_CENTER		= 0X1,
}sct_pwm_mode_list;

extern uint32_t sct0_pwm_event[10];

void zf_sct_get_default_config (sctimer_config_t *config);
void zf_sct_param_set (sctimer_config_t *config, sct_param_list param_index, uint32_t data);
void zf_sct_init (sctimer_config_t *config);
void zf_sct_default_init (void);
void zf_sct_pwm_set_freq (uint32_t freq_hz);
void zf_sct_default_pwm_init (uint32_t freq_hz);
status_t zf_sct_pwm_setup (sct_pwm_channel_list channel, sct_pwm_level_list level, sct_pwm_mode_list mode);
void zf_sct_pwm_update_duty (sct_pwm_channel_list channel, uint8_t duty);


#endif
